package MAIN;

import javax.rmi.CORBA.StubDelegate;
import javax.security.sasl.SaslClient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

//笔试强训第21天
//选择题
/*当完全二叉树的节点个数为偶数时，则度为1的节点个数为1，
* 普通二叉树中，n2 + n1 + n0 = 总节点个数，n0 = n2 + 1；n2代表度为2的节点个数*/
/*循环队列的存储结构是一个数组*/
/*从任意一个节点出发到根路径上所经过的节点序列按关键字排序有序的是：堆*/
/*以最大堆为例，从最大堆任意一个节点出发，走到根节点所经过的路径都是一个递增序列*/
/*二叉排序树就是二叉搜索树，AVL树也是一个二叉搜索树，它是一颗平衡二叉搜索树，哈夫曼树：
* 带权值的树（于元素大小顺序无关）*/
/*对于大根堆进行原地堆排序（升序排序）步骤：首先让堆顶元素和最后一个元素进行交换，向下调整
* 为一个大根堆，此时最后一个元素就是有序的了（因为堆顶元素就是最大值），然后重复上述步骤*/

public class Main21 {
    //MP3光标位置
    public static void mouseMove(String numStr, String orderStr) {
        //歌曲数量
        int n = Integer.parseInt(numStr);
        //指令数组：UD
        char[] order = orderStr.toCharArray();
        //当前鼠标所在位置
        int mouse = 1;
        //显示列表所在的起始位置
        int first = 1;
        //指令处理
        // n <= 4
        if (n <= 4) {
            //循环处理每一个指令
            for (int i = 0; i < order.length; ++i) {
                //光标在第一首歌，按up键光标移动到最后一首歌曲
                if (mouse == 1 && order[i] == 'U') {
                    mouse = n;
                    //光标在最后一首歌曲时，按Down键移动到第一首歌曲
                }else if (mouse == n && order[i] == 'D') {
                    mouse = 1;
                    //其他情况下用户按up键，光标上移一首歌曲
                }else if (order[i] == 'U') {
                    --mouse;
                    //其他情况下用户按down键，光标下移一首歌曲 
                }else if (order[i] == 'D') {
                    ++mouse;
                }
            }
            //输出（注意中间有空格，两边是没有空格的）
            for (int i = 1; i < n; ++i) {
                System.out.print(i + " ");
            }//最后在输出最后一首歌曲
            System.out.println(n);
            //打印当前显示歌曲
            System.out.println(mouse);
        } else {
            //n > 4
            for (int i = 0; i < order.length; ++i) {
                //屏显第一页，光标在第一首歌曲，按up键，要屏显最后一页
                if (first == 1 && mouse == 1 && order[i] == 'U') {
                    //最后一页的起始位置
                    first = n - 3;
                    mouse = n;
                }else if (first == n-3 && mouse == n && order[i] == 'D') {
                    //屏显最后一页，光标在最后一首歌曲上，按down键，要屏显第一页
                    //光标在第一首歌曲上
                    first = 1;
                    mouse = 1;
                }else if (first != 1 && mouse == first && order[i] == 'U') {
                    //处理当前显示不是第一页,光标和first时同一个位置
                    --mouse;
                    --first;
                }else if (first != n-3 && mouse == first+3 && order[i] == 'D') {
                    //屏显不是第一页时，光标在当前屏幕的最后一首歌
                    //按D键，屏幕从当前歌曲下一首开始显示，光标也挪到下一首歌曲
                    first++;
                    mouse++;
                }else if (order[i] == 'U') {
                    mouse--;
                }else if (order[i] == 'D') {
                    mouse++;
                }
            }
            //输出
            for (int i = first; i < first+3; i++) {
                System.out.print(i + " ");
            }
            System.out.println(first + 3);
            //打印当前光标
            System.out.println(mouse);
        }
    }
    public static void main1(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNextLine()) {
            String s1 = scan.nextLine();
            String s2  = scan.nextLine();
            mouseMove(s1,s2);
        }
    }

    //洗牌：有2n张牌 一手拿n张牌  左手：1~n 右手：n+1~2n
    //洗牌的顺序：先右手 后左手 从下往上（编号由大到小）
    //输出的顺序：从上往下 （编号从小到大）
    //思路：根据题意找出洗牌之后牌的位置，然后总结公式
    public static void playCard(int[] cards, int n, int k) {//k代表洗牌的次数
        //i ---> 2*i(从下标开始数)（如果是从编号开始数：i --> 2*i-1）
        //i + n ---> 2 * i + 1
        for (int i = 0; i < k; i++) {
            //一次洗牌的过程
            int[] newCards = new int[cards.length];
            //遍历编号为 0 ~ n-1
            for (int j = 0; j < n; j++) {
                newCards[2 * j] = cards[j];//左手牌变化的位置
                newCards[2 * j + 1] = cards[j + n];//右手牌对应变化的位置
            }
            cards = newCards;
        }
        //从上往下打印
        printCard(cards);
    }

    private static void printCard(int[] cards) {
        for (int i = 0; i < cards.length - 1; i++) {
            System.out.print(cards[i] + " ");
        }
        System.out.println(cards[cards.length - 1]);
    }

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int groups = scan.nextInt();
        for (int i = 0; i < groups; i++) {
            //读入每组数据
            int n = scan.nextInt();//输入n代表的是每组牌有2n个数据
            int k = scan.nextInt();//需要洗牌的次数
            int[] cards = new int[2*n];
            for (int j = 0; j < cards.length; j++) {
                cards[j] = scan.nextInt();
            }
            playCard(cards, n, k);
        }
    }
}
